package cn.wolfcdoe.business.service.impl;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.zip.DeflaterInputStream;

import cn.wolfcdoe.business.domain.BusAppointment;
import cn.wolfcdoe.business.domain.BusCustomerMessage;
import cn.wolfcdoe.business.domain.BusStatement;
import cn.wolfcdoe.business.domain.dto.BusStatementDTO;
import cn.wolfcdoe.business.mapper.BusAppointmentMapper;
import cn.wolfcdoe.business.mapper.BusStatementMapper;
import cn.wolfcdoe.common.constant.BusServiceItemConstants;
import cn.wolfcdoe.common.utils.DateUtils;
import cn.wolfcdoe.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import cn.wolfcdoe.business.mapper.BusStatementItemMapper;
import cn.wolfcdoe.business.domain.BusStatementItem;
import cn.wolfcdoe.business.service.IBusStatementItemService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;

import javax.annotation.Resource;

/**
 * 结算单明细Service业务层处理
 * 
 * @author zhuo
 * @date 2023-04-14
 */
@Service
public class BusStatementItemServiceImpl implements IBusStatementItemService
{
    @Resource
    private BusStatementItemMapper busStatementItemMapper;

    @Resource
    private BusStatementMapper busStatementMapper;

    @Resource
    private BusAppointmentMapper busAppointmentMapper;

    @Resource
    private BusCustomerMessageServiceImpl busCustomerMessageService;

    /**
     * 查询结算单明细
     * 
     * @param id 结算单明细主键
     * @return 结算单明细
     */
    @Override
    public BusStatementItem selectBusStatementItemById(Long id)
    {
        return busStatementItemMapper.selectBusStatementItemById(id);
    }

    /**
     * 查询结算单明细列表
     * 
     * @param busStatementItem 结算单明细
     * @return 结算单明细
     */
    @Override
    public List<BusStatementItem> selectBusStatementItemList(BusStatementItem busStatementItem)
    {
        return busStatementItemMapper.selectBusStatementItemList(busStatementItem);
    }

    /**
     * 新增结算单明细
     * 
     * @param busStatementItem 结算单明细
     * @return 结果
     */
    @Override
    public int insertBusStatementItem(BusStatementItem busStatementItem)
    {
        return busStatementItemMapper.insertBusStatementItem(busStatementItem);
    }

    /**
     * 修改结算单明细
     * 
     * @param busStatementItem 结算单明细
     * @return 结果
     */
    @Override
    public int updateBusStatementItem(BusStatementItem busStatementItem)
    {
        return busStatementItemMapper.updateBusStatementItem(busStatementItem);
    }

    /**
     * 批量删除结算单明细
     * 
     * @param ids 需要删除的结算单明细主键
     * @return 结果
     */
    @Override
    public int deleteBusStatementItemByIds(Long[] ids)
    {
        return busStatementItemMapper.deleteBusStatementItemByIds(ids);
    }

    /**
     * 删除结算单明细信息
     * 
     * @param id 结算单明细主键
     * @return 结果
     */
    @Override
    public int deleteBusStatementItemById(Long id)
    {
        return busStatementItemMapper.deleteBusStatementItemById(id);
    }

    @Override
    public List<BusStatementItem> listStatementItemByStatementId(Long statementId) {
        Assert.notNull(statementId, "非法常数");
        List<BusStatementItem> BusStatementItemList = busStatementItemMapper.listStatementItemByStatementId(statementId);
        return BusStatementItemList;
    }

    @Override
    @Transactional
    public int insertBusStatementItemDTO(BusStatementDTO busStatementDTO) {

        BusStatement originBusStatement = getBusStatement(busStatementDTO);

        return busStatementMapper.updateBusStatement(originBusStatement);
    }

    @Override
    @Transactional
    public int payStatement(BusStatementDTO busStatementDTO) {
        BusStatement originBusStatement = getBusStatement(busStatementDTO);
        originBusStatement.setPayTime(DateUtils.getNowDate());
        originBusStatement.setPayeeId(SecurityUtils.getUserId());
        //把结算表中的状态改成已支付
        originBusStatement.setStatus(BusServiceItemConstants.STATEMENT_STATUS_PAYED);
        //把预约表中的已结算的转态改成已支付
        Long statementId = busStatementDTO.getStatementId();
        BusStatement busStatement = busStatementMapper.selectBusStatementById(statementId);
        Long appointmentId = busStatement.getAppointmentId();
        BusAppointment busAppointment = busAppointmentMapper.selectBusAppointmentById(appointmentId);
        busAppointment.setStatus(BusServiceItemConstants.APPOINTMENT_STATUS_PAYED);
        busAppointmentMapper.updateBusAppointment(busAppointment);

        //创建一个客户信息对象
        BusCustomerMessage busCustomerMessage = new BusCustomerMessage();
        busCustomerMessage.setCustomerName(originBusStatement.getCustomerName());
        busCustomerMessage.setCustomerPhone(originBusStatement.getCustomerPhone());
        busCustomerMessage.setLicensePlate(originBusStatement.getLicensePlate());
        busCustomerMessage.setEnteringTime(DateUtils.getNowDate());
        busCustomerMessage.setEnteringPerson(SecurityUtils.getUsername());
        busCustomerMessageService.insertBusCustomerMessage(busCustomerMessage);

        return busStatementMapper.updateBusStatement(originBusStatement);
    }
    private BusStatement getBusStatement(BusStatementDTO busStatementDTO) {
        //(修改)往结算单表数据
        Long statementId = busStatementDTO.getStatementId();
        Assert.notNull(statementId, "非法常数");
        BusStatement busStatement = busStatementMapper.selectBusStatementById(statementId);
        Assert.notNull(busStatement, "非法常数");

        BigDecimal totalQuantity = BigDecimal.ZERO;
        BigDecimal totalAnount = BigDecimal.ZERO;
        //保存之前先删除之前的明细数据
        busStatementItemMapper.deleteBusStatementItemById(statementId);
        for (BusStatementItem busStatementItem : busStatementDTO.getBusStatementItems()) {
            //往明细表中添加数据
            busStatementItemMapper.insertBusStatementItem(busStatementItem);
            //获取数量
            BigDecimal quantity = busStatementItem.getItemQuantity();
            //汇总数量
            totalQuantity = totalQuantity.add(quantity);
            //汇总价格
            totalAnount = totalAnount.add(busStatementItem.getItemPrice().multiply(quantity));
        }
        //修改结算单数据
        BusStatement originBusStatement = busStatementMapper.selectBusStatementById(busStatementDTO.getStatementId());
        originBusStatement.setTotalAmount(totalAnount);                             //总价格
        originBusStatement.setTotalQuantity(totalQuantity);                         //总数量
        originBusStatement.setDiscountAmount(busStatementDTO.getDiscountPrice());  //优惠价格

        return originBusStatement;
    }


}
